package com.ljx.other;

import lombok.Data;

import java.util.Objects;

/**
 * == 以及 equals 有什么区别
 * @author: zhangrunkai
 * @date: 2023/3/14
 */
public class EqualsTest {

    public static void main(String[] args) {
        B a = new B();
        a.key = 1;
        a.value = 2;

        B b = new B();
        b.key = 1;
        b.value = 2;
        System.out.println(a == b); // false

        // 上面其实等同于调用toString方法， 因为两个引用指向的是不同的对象，所以不一样
        System.out.println(a.toString() == b.toString());

        // 还是等于false， 原因是因为调用的是Object.equals方法，本质还是用的是 ==
        System.out.println(a.equals(b));


        C c = new C();
        a.key = 1;
        a.value = 2;

        C d = new C();
        b.key = 1;
        b.value = 2;

        // false，应该可以理解了
        System.out.println(c == d);

        // 为什么这里就为true了
        System.out.println(c.equals(d));

        // 其实使用的@Data注解，在编译的时候，lombok帮我们填写了一些方法，比如set,get方法，其中也包括了toString ,equals方法
        // 具体情况，看看target下的C.class,

        // 如果没有@Data, 我们需要怎么做?
        // 定义后，需要手写get,set方法外，最好把equals也重写了，看看D类
    }
}
class B {
    int key;
    int value;

}

@Data
class C {
    int key;
    int value;
}
class D {
    private int key;
    private int value;

    public D() {
    }

    public int getKey() {
        return key;
    }

    public void setKey(int key) {
        this.key = key;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof D)) return false;
        D d = (D) o;
        return key == d.key && value == d.value;
    }

    @Override
    public String toString() {
        return "D{" +
                "key=" + key +
                ", value=" + value +
                '}';
    }
}